package com.woniuxy.aspectj;


import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @Author: 马宇航
 * @Todo: 切面类，工具类
 * @DateTime: 22/03/28/0028 下午 3:27
 * @Component: 成都蜗牛学苑
 **/
@Aspect //它是一个切面
@Component//组件 工具的意思
public class MyAspectJ {
    @Pointcut("execution(* *(..))")
    public void pointCut(){

    }
    /**
     * 前置通知
     * ChangeLog : 1. 创建 (22/03/28/0028 下午 3:28 [马宇航]);
     * @param joinpoint  连接点
     * @return void
    */
    @Before("pointCut()")
    public void myBefore(JoinPoint joinpoint){
        System.out.println("----------------------------------------");
        System.out.println("前置通知：日志打印开始……");
        System.out.println("对应目标类是："+joinpoint.getTarget());
        System.out.println("对应目标类的方法是："+joinpoint.getSignature().getName());
        System.out.println("----------------------------------------");
    }
    /**
     * 后置通知
     * ChangeLog : 1. 创建 (22/03/28/0028 下午 4:32 [马宇航]);
     * @param joinpoint
     * @return void
    */
    @AfterReturning("pointCut()")
    public void afterReturing(JoinPoint joinpoint){
        System.out.println("----------------------------------------");
        System.out.println("后置通知：事务提交开始……");
        System.out.println("对应目标类是："+joinpoint.getTarget());
        System.out.println("对应目标类的方法是："+joinpoint.getSignature().getName());
        System.out.println("----------------------------------------");
    }
    /**
     * 最终通知
     * ChangeLog : 1. 创建 (22/03/28/0028 下午 4:32 [马宇航]);
     *
     * @return void
    */
    @After("pointCut()")
    public void after(){
        System.out.println("----------------------------------------");
        System.out.println("最终通知执行，无论你的代码是否发生异常。");
        System.out.println("----------------------------------------");
    }
    /**
     * 异常通知
     * ChangeLog : 1. 创建 (22/03/28/0028 下午 4:33 [马宇航]);
     * @param e
     * @return void
    */
    @AfterThrowing(value = "pointCut()",throwing="e")
    public void afterThrowing(Exception e){
        System.out.println("----------------------------------------");
        System.out.println("异常通知执行：报错类型是"+e.getMessage());
        System.out.println("----------------------------------------");
    }
    /**
     * 内部环绕：不推荐使用，因为环绕通知，可以修改入参。可以修改返回值！
     * ChangeLog : 1. 创建 (22/03/28/0028 下午 4:39 [马宇航]);
     * @param joinPoint
     * @return void
    */
    @Around("pointCut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("环绕通知：前置通知……");
        //目标方法的入参
        Object[] args = joinPoint.getArgs();
        //环绕通知中，目标方法的执行
        Object proceed = joinPoint.proceed(args);
        System.out.println(proceed);
        System.out.println("环绕通知：后置通知……");
        return proceed;
    }
}
